<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Inversion of control</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Inversion_of_control"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Inversion_of_control rootpage-Inversion_of_control skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Inversion of control</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr">
<p class="mw-empty-elt">
</p><p>In <a href="Software_engineering" title="Software engineering">software engineering</a>, <b>inversion of control</b> (<b>IoC</b>) is a design principle in which custom-written portions of a <a href="Computer_program" title="Computer program">computer program</a> receive the <a href="Control_flow" title="Control flow">flow of control</a> from an external source (e.g. a <a href="Software_framework" title="Software framework">framework</a>). The term "inversion" is historical: a <a href="Software_architecture" title="Software architecture">software architecture</a> with this design "inverts" control as compared to <a href="Procedural_programming" title="Procedural programming">procedural programming</a>. In procedural programming, a program's custom code <a href="Function_call" class="mw-redirect" title="Function call">calls</a> reusable libraries to take care of generic tasks, but with inversion of control, it is the external code or framework that is in control and calls the custom code.
</p><p>Inversion of control has been widely used by application development frameworks since the rise of GUI environments<sup id="cite_ref-Mesa1985_1-0" class="reference"><a href="#cite_note-Mesa1985-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup> and continues to be used both in GUI environments and in <a href="Web_framework" title="Web framework">web server application frameworks</a>. Inversion of control makes the framework <a href="Extensible_programming" title="Extensible programming">extensible</a> by the methods defined by the application programmer.<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup>
</p><p><a href="Event-driven_programming" title="Event-driven programming">Event-driven programming</a> is often implemented using IoC so that the custom code need only be concerned with the handling of events, while the <a href="Event_loop" title="Event loop">event loop</a> and dispatch of events/messages is handled by the framework or the runtime environment. In web server application frameworks, dispatch is usually called routing, and handlers may be called endpoints.
</p>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="Alternative_meaning">Alternative meaning</h2></div>
<p>The phrase "inversion of control" has separately also come to be used in the community of Java programmers to refer specifically to the patterns of <a href="Dependency_injection" title="Dependency injection">dependency injection</a> (passing services to objects that need them) that occur with "IoC containers" in Java frameworks such as the <a href="Spring_Framework" title="Spring Framework">Spring Framework</a>.<sup id="cite_ref-FowlerDI-IOC_4-0" class="reference"><a href="#cite_note-FowlerDI-IOC-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup> In this different sense, "inversion of control" refers to granting the framework control over the implementations of dependencies that are used by application objects<sup id="cite_ref-spring_framework_ioc_docs_5-0" class="reference"><a href="#cite_note-spring_framework_ioc_docs-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup> rather than to the original meaning of granting the framework <a href="Control_flow" title="Control flow">control flow</a> (control over the time of execution of application code, e.g. callbacks).
</p>
<div class="mw-heading mw-heading2"><h2 id="Overview">Overview</h2></div>
<p>As an example, with traditional programming, the <a href="Main_function" class="mw-redirect" title="Main function">main function</a> of an application might make function calls into a menu library to display a list of available <a href="Command_(computing)" title="Command (computing)">commands</a> and query the user to select one.<sup id="cite_ref-FowlerDI_6-0" class="reference"><a href="#cite_note-FowlerDI-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup> The library thus would return the chosen option as the value of the function call, and the main function uses this value to execute the associated command. This style was common in <a href="Text_based_interface" class="mw-redirect" title="Text based interface">text-based interfaces</a>. For example, an <a href="Email_client" title="Email client">email client</a> may show a screen with commands to load new mail, answer the current mail, create new mail, etc., and the program execution would block until the user presses a key to select a command.
</p><p>With inversion of control, on the other hand, the program would be written using a <a href="Software_framework" title="Software framework">software framework</a> that knows common behavioral and graphical elements, such as <a href="Windowing_system" title="Windowing system">windowing systems</a>, menus, controlling the mouse, and toolbars. The custom code "fills in the blanks" for the framework, such as supplying a table of menu items and registering a code subroutine for each item, but it is the framework that monitors the user's actions and invokes the subroutine when a menu item is selected. In the mail client example, the framework could follow both the keyboard and mouse inputs and call the command invoked by the user by either means and at the same time monitor the <a href="Network_interface_controller" title="Network interface controller">network interface</a> to find out if new messages arrive and refresh the screen when some network activity is detected. The same framework could be used as the skeleton for a spreadsheet program or a text editor. Conversely, the framework knows nothing about Web browsers, spreadsheets, or text editors; implementing their functionality takes custom code.
</p><p>Inversion of control carries the strong connotation that the reusable code and the problem-specific code are developed independently even though they operate together in an application. <a href="Callback_(computer_programming)" title="Callback (computer programming)">Callbacks</a>, <a href="Scheduling_(computing)" title="Scheduling (computing)">schedulers</a>, <a href="Event_loop" title="Event loop">event loops</a>, and the <a href="Template_method" class="mw-redirect" title="Template method">template method</a> are examples of <a href="Design_pattern" title="Design pattern">design patterns</a> that follow the inversion of control principle, although the term is most commonly used in the context of <a href="Object-oriented_programming" title="Object-oriented programming">object-oriented programming</a>. (<a href="Dependency_injection" title="Dependency injection">Dependency injection</a> is an example of the separate, specific idea of "inverting control over the implementations of dependencies" popularised by Java frameworks.)<sup id="cite_ref-FowlerDI-IOC_4-1" class="reference"><a href="#cite_note-FowlerDI-IOC-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>
</p><p>Inversion of control is sometimes referred to as the "Hollywood Principle: Don't call us, we'll call you," reflecting how frameworks dictate execution flow.<sup id="cite_ref-Mesa1985_1-1" class="reference"><a href="#cite_note-Mesa1985-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Background">Background</h2></div>
<p>Inversion of control is not a new term in computer science. <a href="Martin_Fowler_(software_engineer)" title="Martin Fowler (software engineer)">Martin Fowler</a> traces the etymology of the phrase back to 1988,<sup id="cite_ref-FowlerIoC_7-0" class="reference"><a href="#cite_note-FowlerIoC-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup> but it is closely
related to the concept of <b>program inversion</b> described by <a href="Michael_A._Jackson_(computer_scientist)" title="Michael A. Jackson (computer scientist)">Michael Jackson</a> in his <a href="Jackson_Structured_Programming" class="mw-redirect" title="Jackson Structured Programming">Jackson Structured Programming</a> methodology in the 1970s.<sup id="cite_ref-8" class="reference"><a href="#cite_note-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup> A <a href="Bottom-up_parsing" title="Bottom-up parsing">bottom-up parser</a> can be seen as an inversion of a <a href="Top-down_parsing" title="Top-down parsing">top-down parser</a>: in the one case, the
control lies with the parser, while in the other case, it lies with the receiving application.
</p><p>The term was used by Michael Mattsson in a thesis (with its original meaning of a framework calling application code instead of vice versa)<sup id="cite_ref-9" class="reference"><a href="#cite_note-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup> and was then taken from there<sup id="cite_ref-10" class="reference"><a href="#cite_note-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup> by Stefano Mazzocchi and popularized by him in 1999 in a defunct Apache Software Foundation project, Avalon, in which it referred to a parent object passing in a child object's dependencies in addition to controlling execution flow.<sup id="cite_ref-AvalonIoCPatterns_11-0" class="reference"><a href="#cite_note-AvalonIoCPatterns-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup> The phrase was further popularized in 2004 by <a href="Robert_Cecil_Martin" class="mw-redirect" title="Robert Cecil Martin">Robert C. Martin</a> and <a href="Martin_Fowler_(software_engineer)" title="Martin Fowler (software engineer)">Martin Fowler</a>, the latter of whom traces the term's origins to the 1980s.<sup id="cite_ref-FowlerIoC_7-1" class="reference"><a href="#cite_note-FowlerIoC-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Description">Description</h2></div>
<p>In traditional programming, the <a href="Control_flow" title="Control flow">flow</a> of the <a href="Business_logic" title="Business logic">business logic</a> is determined by objects that are <a href="Static_binding" class="mw-redirect" title="Static binding">statically bound</a> to one another. With inversion of control, the flow depends on the object graph that is built up during program execution. Such a dynamic flow is made possible by object interactions that are defined through abstractions. This <a href="Late_binding" title="Late binding">run-time binding</a> is achieved by mechanisms such as <a href="Dependency_injection" title="Dependency injection">dependency injection</a> or a <a href="Service_locator_pattern" title="Service locator pattern">service locator</a>. In IoC, the code could also be linked statically during compilation, but finding the code to execute by reading its description from <a href="Configuration_file" title="Configuration file">external configuration</a> instead of with a direct reference in the code itself.
</p><p>In dependency injection, a dependent <a href="Object-oriented_programming" title="Object-oriented programming">object</a> or module is coupled to the object it needs at <a href="Run_time_(program_lifecycle_phase)" class="mw-redirect" title="Run time (program lifecycle phase)">run time</a>. Which particular object will satisfy the dependency during program execution typically cannot be known at <a href="Compile_time" title="Compile time">compile time</a> using <a href="Static_code_analysis" class="mw-redirect" title="Static code analysis">static analysis</a>. While described in terms of object interaction here, the principle can apply to other programming methodologies besides <a href="Object-oriented_programming" title="Object-oriented programming">object-oriented programming</a>.
</p><p>In order for the running program to bind objects to one another, the objects must possess compatible <a href="Software_interface" class="mw-redirect" title="Software interface">interfaces</a>. For example, class <code>A</code> may delegate behavior to interface <code>I</code> which is implemented by class <code>B</code>; the program instantiates <code>A</code> and <code>B</code>, and then injects <code>B</code> into <code>A</code>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Use">Use</h2></div>
<ul><li>The <a href="Mesa_(programming_language)" title="Mesa (programming language)">Mesa</a> Programming environment for <a href="Xerox_Development_Environment" title="Xerox Development Environment">XDE</a>, 1985<sup id="cite_ref-Mesa1985_1-2" class="reference"><a href="#cite_note-Mesa1985-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup></li>
<li><a href="Visual_Basic_(classic)" title="Visual Basic (classic)">Visual Basic (classic)</a>, 1991.</li>
<li>HTML <a href="DOM_event" title="DOM event">DOM event</a></li>
<li>The <a href="Spring_Framework" title="Spring Framework">Spring Framework</a><sup id="cite_ref-spring_framework_ioc_docs_5-1" class="reference"><a href="#cite_note-spring_framework_ioc_docs-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup></li>
<li><a href="ASP.NET_Core" title="ASP.NET Core">ASP.NET Core</a><sup id="cite_ref-AspNetCore7Routing_12-0" class="reference"><a href="#cite_note-AspNetCore7Routing-12"><span class="cite-bracket">[</span>12<span class="cite-bracket">]</span></a></sup></li>
<li><a href="Template_method_pattern" title="Template method pattern">Template method pattern</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Example_code">Example code</h2></div>
<div class="mw-heading mw-heading3"><h3 id="HTML_DOM_events">HTML DOM events</h3></div>
<p>Web browsers implement inversion of control for DOM events in HTML. The application developer uses <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">document.addEventListener()</code> to register a callback.
</p>
<div class="mw-highlight mw-highlight-lang-html mw-content-ltr" dir="ltr"><pre><span class="cp"><!doctype html></span>
<span class="p"><</span><span class="nt">html</span> <span class="na">lang</span><span class="o">=</span><span class="s">"en"</span><span class="p">></span>
<span class="p"><</span><span class="nt">head</span><span class="p">></span>
<span class="p"><</span><span class="nt">meta</span> <span class="na">charset</span><span class="o">=</span><span class="s">"utf-8"</span><span class="p">></span>
<span class="p"><</span><span class="nt">title</span><span class="p">></span>DOM Level 2<span class="p"></</span><span class="nt">title</span><span class="p">></span>
<span class="p"></</span><span class="nt">head</span><span class="p">></span>
<span class="p"><</span><span class="nt">body</span><span class="p">></span>
<span class="p"><</span><span class="nt">h1</span><span class="p">></span>DOM Level 2 Event handler<span class="p"></</span><span class="nt">h1</span><span class="p">></span>
<span class="p"><</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">"output"</span><span class="p">></</span><span class="nt">div</span><span class="p">></span>
<span class="p"><</span><span class="nt">script</span><span class="p">></span>
<span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nx">listener</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kd">function</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">"output"</span><span class="p">).</span><span class="nx">innerHTML</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"<p>The registered listener was called.</p>"</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span>
<span class="w"> </span><span class="nb">document</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s2">"click"</span><span class="p">,</span><span class="w"> </span><span class="nx">listener</span><span class="p">,</span><span class="w"> </span><span class="kc">true</span><span class="p">);</span>
<span class="w"> </span><span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">"output"</span><span class="p">).</span><span class="nx">innerHTML</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"<p>The event handler has been registered. If you click the page, your web browser will call the event handler.</p>"</span>
<span class="w"> </span><span class="p"></</span><span class="nt">script</span><span class="p">></span>
<span class="p"></</span><span class="nt">body</span><span class="p">></span>
<span class="p"></</span><span class="nt">html</span><span class="p">></span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Web_application_frameworks">Web application frameworks</h3></div>
<p>This example code for an ASP.NET Core web application creates a web application host, registers an endpoint, and then passes control to the framework:<sup id="cite_ref-AspNetCore7Routing_12-1" class="reference"><a href="#cite_note-AspNetCore7Routing-12"><span class="cite-bracket">[</span>12<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-highlight mw-highlight-lang-csharp mw-content-ltr" dir="ltr"><pre><span class="kt">var</span><span class="w"> </span><span class="n">builder</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">WebApplication</span><span class="p">.</span><span class="n">CreateBuilder</span><span class="p">(</span><span class="n">args</span><span class="p">);</span>
<span class="kt">var</span><span class="w"> </span><span class="n">app</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">builder</span><span class="p">.</span><span class="n">Build</span><span class="p">();</span>
<span class="n">app</span><span class="p">.</span><span class="n">MapGet</span><span class="p">(</span><span class="s">"/"</span><span class="p">,</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="s">"Hello World!"</span><span class="p">);</span>
<span class="n">app</span><span class="p">.</span><span class="n">Run</span><span class="p">();</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="See_also">See also</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1184024115">
/* start https://en.wikipedia.org/ */
.mw-parser-output .div-col{margin-top:0.3em;column-width:30em}.mw-parser-output .div-col-small{font-size:90%}.mw-parser-output .div-col-rules{column-rule:1px solid #aaa}.mw-parser-output .div-col dl,.mw-parser-output .div-col ol,.mw-parser-output .div-col ul{margin-top:0}.mw-parser-output .div-col li,.mw-parser-output .div-col dd{page-break-inside:avoid;break-inside:avoid-column}
/* end https://en.wikipedia.org/ */
</style><div class="div-col" style="column-width: 22em;">
<ul><li><a href="Abstraction_layer" title="Abstraction layer">Abstraction layer</a></li>
<li><a href="Asynchronous_I/O" title="Asynchronous I/O">Asynchronous I/O</a></li>
<li><a href="Aspect-oriented_programming" title="Aspect-oriented programming">Aspect-oriented programming</a></li>
<li><a href="Callback_(computer_science)" class="mw-redirect" title="Callback (computer science)">Callback (computer science)</a></li>
<li><a href="Closure_(computer_science)" class="mw-redirect" title="Closure (computer science)">Closure (computer science)</a></li>
<li><a href="Continuation" title="Continuation">Continuation</a></li>
<li><a href="Delegate_(CLI)" title="Delegate (CLI)">Delegate (CLI)</a></li>
<li><a href="Dependency_inversion_principle" title="Dependency inversion principle">Dependency inversion principle</a></li>
<li><a href="Flow-based_programming" title="Flow-based programming">Flow-based programming</a></li>
<li><a href="Implicit_invocation" title="Implicit invocation">Implicit invocation</a></li>
<li><a href="Interrupt_handler" title="Interrupt handler">Interrupt handler</a></li>
<li><a href="Message_passing" title="Message passing">Message passing</a></li>
<li><a href="Monad_(functional_programming)" title="Monad (functional programming)">Monad (functional programming)</a></li>
<li><a href="Observer_pattern" title="Observer pattern">Observer pattern</a></li>
<li><a href="Publish%E2%80%93subscribe_pattern" title="Publish–subscribe pattern">Publish–subscribe pattern</a></li>
<li><a href="Service_locator_pattern" title="Service locator pattern">Service locator pattern</a></li>
<li><a href="Signal_(computing)" class="mw-redirect" title="Signal (computing)">Signal (computing)</a></li>
<li><a href="Software_framework" title="Software framework">Software framework</a></li>
<li><a href="Strategy_pattern" title="Strategy pattern">Strategy pattern</a></li>
<li><a href="User_exit" title="User exit">User exit</a></li>
<li><a href="Visitor_pattern" title="Visitor pattern">Visitor pattern</a></li>
<li><a href="XSLT" title="XSLT">XSLT</a></li></ul>
</div>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<div class="mw-references-wrap mw-references-columns"><ol class="references">
<li id="cite_note-Mesa1985-1"><span class="mw-cite-backlink">^ <a href="#cite_ref-Mesa1985_1-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Mesa1985_1-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-Mesa1985_1-2"><sup><i><b>c</b></i></sup></a></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */
.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}
/* end https://en.wikipedia.org/ */
</style><cite id="CITEREFSweet1985" class="citation journal cs1">Sweet, Richard (25 June 1985). <span class="id-lock-subscription" title="Paid subscription required"><a rel="nofollow" class="external text" href="https://dl.acm.org/doi/abs/10.1145/17919.806843">"The Mesa Programming Environment"</a></span>. <i>ACM SIGPLAN Notices</i>. <b>20</b> (7): <span class="nowrap">216–</span>229. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F17919.806843">10.1145/17919.806843</a>.</cite></span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-2">^</a></b></span> <span class="reference-text"><a href="Visual_Basic_(classic)" title="Visual Basic (classic)">Visual_Basic_(classic)</a></span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-3">^</a></b></span> <span class="reference-text"><cite id="CITEREFJohnsonFoote1988" class="citation journal cs1">Johnson, Ralph E.; Foote, Brian (June–July 1988). <a rel="nofollow" class="external text" href="http://www.laputan.org/drc/drc.html">"Designing Reusable Classes"</a>. <i>Journal of Object-Oriented Programming</i>. <b>1</b> (2): <span class="nowrap">22–</span>35. <a href="CiteSeerX_(identifier)" class="mw-redirect" title="CiteSeerX (identifier)">CiteSeerX</a> <span class="id-lock-free" title="Freely accessible"><a rel="nofollow" class="external text" href="https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.101.8594">10.1.1.101.8594</a></span><span class="reference-accessdate">. Retrieved <span class="nowrap">29 April</span> 2014</span>.</cite></span>
</li>
<li id="cite_note-FowlerDI-IOC-4"><span class="mw-cite-backlink">^ <a href="#cite_ref-FowlerDI-IOC_4-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-FowlerDI-IOC_4-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite id="CITEREFFowler" class="citation web cs1">Fowler, Martin. <a rel="nofollow" class="external text" href="https://martinfowler.com/articles/injection.html#InversionOfControl">"Inversion of Control Containers and the Dependency Injection pattern"</a>. <i>MartinFowler.com</i><span class="reference-accessdate">. Retrieved <span class="nowrap">4 June</span> 2023</span>.</cite></span>
</li>
<li id="cite_note-spring_framework_ioc_docs-5"><span class="mw-cite-backlink">^ <a href="#cite_ref-spring_framework_ioc_docs_5-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-spring_framework_ioc_docs_5-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://docs.spring.io/spring-framework/docs/2.5.5/reference/beans.html">"Spring Framework The IoC container"</a>. <i>docs.spring.io</i><span class="reference-accessdate">. Retrieved <span class="nowrap">25 May</span> 2023</span>.</cite></span>
</li>
<li id="cite_note-FowlerDI-6"><span class="mw-cite-backlink"><b><a href="#cite_ref-FowlerDI_6-0">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://martinfowler.com/articles/injection.html">Dependency Injection</a>.</span>
</li>
<li id="cite_note-FowlerIoC-7"><span class="mw-cite-backlink">^ <a href="#cite_ref-FowlerIoC_7-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-FowlerIoC_7-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://martinfowler.com/bliki/InversionOfControl.html">Inversion of Control</a> on Martin Fowler's Bliki</span>
</li>
<li id="cite_note-8"><span class="mw-cite-backlink"><b><a href="#cite_ref-8">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://www.jacksonworkbench.co.uk/stevefergspages/papers/ourusoff--introduction_to_jackson_design_method.pdf">"Introduction to Jackson Design Method"</a> <span class="cs1-format">(PDF)</span>.</cite></span>
</li>
<li id="cite_note-9"><span class="mw-cite-backlink"><b><a href="#cite_ref-9">^</a></b></span> <span class="reference-text"><cite id="CITEREFMattsson1996" class="citation web cs1">Mattsson, Michael (February 1996). <a rel="nofollow" class="external text" href="https://www.researchgate.net/publication/2238535">"Object-Oriented Frameworks, A survey of methodological issues"</a>. Department of Computer Science, Lund University. <a href="CiteSeerX_(identifier)" class="mw-redirect" title="CiteSeerX (identifier)">CiteSeerX</a> <span class="id-lock-free" title="Freely accessible"><a rel="nofollow" class="external text" href="https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.36.1424">10.1.1.36.1424</a></span>. LU-CS-TR: 96-167.</cite></span>
</li>
<li id="cite_note-10"><span class="mw-cite-backlink"><b><a href="#cite_ref-10">^</a></b></span> <span class="reference-text"><cite id="CITEREFStefano_Mazzocchi2004" class="citation web cs1">Stefano Mazzocchi (22 January 2004). <a rel="nofollow" class="external text" href="https://web.archive.org/web/20040202120126/http://www.betaversion.org/~stefano/linotype/news/38/">"On Inversion of Control"</a>. Archived from <a rel="nofollow" class="external text" href="http://www.betaversion.org/~stefano/linotype/news/38/">the original</a> on 2 February 2004.</cite></span>
</li>
<li id="cite_note-AvalonIoCPatterns-11"><span class="mw-cite-backlink"><b><a href="#cite_ref-AvalonIoCPatterns_11-0">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://svn.apache.org/repos/asf/avalon/site///framework/cop/guide-patterns-ioc.html">"IOC Patterns - Avalon Framework"</a>. <i>The Apache Avalon Project</i><span class="reference-accessdate">. Retrieved <span class="nowrap">8 June</span> 2023</span>.</cite></span>
</li>
<li id="cite_note-AspNetCore7Routing-12"><span class="mw-cite-backlink">^ <a href="#cite_ref-AspNetCore7Routing_12-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-AspNetCore7Routing_12-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite id="CITEREFRyan_Nowak,_Kirk_Larkin,_Rick_Anderson" class="citation web cs1">Ryan Nowak, Kirk Larkin, Rick Anderson. <a rel="nofollow" class="external text" href="https://learn.microsoft.com/en-us/aspnet/core/fundamentals/routing">""Routing in ASP.Net Core""</a>. <i>learn.microsoft.com</i>. microsoft<span class="reference-accessdate">. Retrieved <span class="nowrap">25 May</span> 2023</span>. <q>Routing is responsible for matching incoming HTTP requests and dispatching those requests to the app's executable endpoints. Endpoints are the app's units of executable request-handling code. Endpoints are defined in the app and configured when the app starts.</q></cite><span class="cs1-maint citation-comment"><code class="cs1-code">{{cite web}}</code>: CS1 maint: multiple names: authors list (link)</span></span>
</li>
</ol></div>
<div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2></div>
<ul><li><a rel="nofollow" class="external text" href="http://javaprogrammernotes.blogspot.com/2015/03/inversion-of-control-dependency.html">Inversion of Control explanation and implementation example</a></li>
<li><a rel="nofollow" class="external text" href="https://www.sebaslab.com/the-truth-behind-inversion-of-control-part-ii-inversion-of-control/">Inversion of Control</a></li></ul>
<div class="navbox-styles"><style data-mw-deduplicate="TemplateStyles:r1129693374">
/* start https://en.wikipedia.org/ */
.mw-parser-output .hlist dl,.mw-parser-output .hlist ol,.mw-parser-output .hlist ul{margin:0;padding:0}.mw-parser-output .hlist dd,.mw-parser-output .hlist dt,.mw-parser-output .hlist li{margin:0;display:inline}.mw-parser-output .hlist.inline,.mw-parser-output .hlist.inline dl,.mw-parser-output .hlist.inline ol,.mw-parser-output .hlist.inline ul,.mw-parser-output .hlist dl dl,.mw-parser-output .hlist dl ol,.mw-parser-output .hlist dl ul,.mw-parser-output .hlist ol dl,.mw-parser-output .hlist ol ol,.mw-parser-output .hlist ol ul,.mw-parser-output .hlist ul dl,.mw-parser-output .hlist ul ol,.mw-parser-output .hlist ul ul{display:inline}.mw-parser-output .hlist .mw-empty-li{display:none}.mw-parser-output .hlist dt::after{content:": "}.mw-parser-output .hlist dd::after,.mw-parser-output .hlist li::after{content:" · ";font-weight:bold}.mw-parser-output .hlist dd:last-child::after,.mw-parser-output .hlist dt:last-child::after,.mw-parser-output .hlist li:last-child::after{content:none}.mw-parser-output .hlist dd dd:first-child::before,.mw-parser-output .hlist dd dt:first-child::before,.mw-parser-output .hlist dd li:first-child::before,.mw-parser-output .hlist dt dd:first-child::before,.mw-parser-output .hlist dt dt:first-child::before,.mw-parser-output .hlist dt li:first-child::before,.mw-parser-output .hlist li dd:first-child::before,.mw-parser-output .hlist li dt:first-child::before,.mw-parser-output .hlist li li:first-child::before{content:" (";font-weight:normal}.mw-parser-output .hlist dd dd:last-child::after,.mw-parser-output .hlist dd dt:last-child::after,.mw-parser-output .hlist dd li:last-child::after,.mw-parser-output .hlist dt dd:last-child::after,.mw-parser-output .hlist dt dt:last-child::after,.mw-parser-output .hlist dt li:last-child::after,.mw-parser-output .hlist li dd:last-child::after,.mw-parser-output .hlist li dt:last-child::after,.mw-parser-output .hlist li li:last-child::after{content:")";font-weight:normal}.mw-parser-output .hlist ol{counter-reset:listitem}.mw-parser-output .hlist ol>li{counter-increment:listitem}.mw-parser-output .hlist ol>li::before{content:" "counter(listitem)"\a0 "}.mw-parser-output .hlist dd ol>li:first-child::before,.mw-parser-output .hlist dt ol>li:first-child::before,.mw-parser-output .hlist li ol>li:first-child::before{content:" ("counter(listitem)"\a0 "}
/* end https://en.wikipedia.org/ */
</style><style data-mw-deduplicate="TemplateStyles:r1236075235">
/* start https://en.wikipedia.org/ */
.mw-parser-output .navbox{box-sizing:border-box;border:1px solid #a2a9b1;width:100%;clear:both;font-size:88%;text-align:center;padding:1px;margin:1em auto 0}.mw-parser-output .navbox .navbox{margin-top:0}.mw-parser-output .navbox+.navbox,.mw-parser-output .navbox+.navbox-styles+.navbox{margin-top:-1px}.mw-parser-output .navbox-inner,.mw-parser-output .navbox-subgroup{width:100%}.mw-parser-output .navbox-group,.mw-parser-output .navbox-title,.mw-parser-output .navbox-abovebelow{padding:0.25em 1em;line-height:1.5em;text-align:center}.mw-parser-output .navbox-group{white-space:nowrap;text-align:right}.mw-parser-output .navbox,.mw-parser-output .navbox-subgroup{background-color:#fdfdfd}.mw-parser-output .navbox-list{line-height:1.5em;border-color:#fdfdfd}.mw-parser-output .navbox-list-with-group{text-align:left;border-left-width:2px;border-left-style:solid}.mw-parser-output tr+tr>.navbox-abovebelow,.mw-parser-output tr+tr>.navbox-group,.mw-parser-output tr+tr>.navbox-image,.mw-parser-output tr+tr>.navbox-list{border-top:2px solid #fdfdfd}.mw-parser-output .navbox-title{background-color:#ccf}.mw-parser-output .navbox-abovebelow,.mw-parser-output .navbox-group,.mw-parser-output .navbox-subgroup .navbox-title{background-color:#ddf}.mw-parser-output .navbox-subgroup .navbox-group,.mw-parser-output .navbox-subgroup .navbox-abovebelow{background-color:#e6e6ff}.mw-parser-output .navbox-even{background-color:#f7f7f7}.mw-parser-output .navbox-odd{background-color:transparent}.mw-parser-output .navbox .hlist td dl,.mw-parser-output .navbox .hlist td ol,.mw-parser-output .navbox .hlist td ul,.mw-parser-output .navbox td.hlist dl,.mw-parser-output .navbox td.hlist ol,.mw-parser-output .navbox td.hlist ul{padding:0.125em 0}.mw-parser-output .navbox .navbar{display:block;font-size:100%}.mw-parser-output .navbox-title .navbar{float:left;text-align:left;margin-right:0.5em}body.skin--responsive .mw-parser-output .navbox-image img{max-width:none!important}@media print{body.ns-0 .mw-parser-output .navbox{display:none!important}}
/* end https://en.wikipedia.org/ */
</style></div><div role="navigation" class="navbox" aria-labelledby="Software_design_patterns225" style="padding:3px"><table class="nowraplinks mw-collapsible autocollapse navbox-inner" style="border-spacing:0;background:transparent;color:inherit"><tbody><tr><th scope="col" class="navbox-title" colspan="2"><style data-mw-deduplicate="TemplateStyles:r1239400231">
/* start https://en.wikipedia.org/ */
.mw-parser-output .navbar{display:inline;font-size:88%;font-weight:normal}.mw-parser-output .navbar-collapse{float:left;text-align:left}.mw-parser-output .navbar-boxtext{word-spacing:0}.mw-parser-output .navbar ul{display:inline-block;white-space:nowrap;line-height:inherit}.mw-parser-output .navbar-brackets::before{margin-right:-0.125em;content:"[ "}.mw-parser-output .navbar-brackets::after{margin-left:-0.125em;content:" ]"}.mw-parser-output .navbar li{word-spacing:-0.125em}.mw-parser-output .navbar a>span,.mw-parser-output .navbar a>abbr{text-decoration:inherit}.mw-parser-output .navbar-mini abbr{font-variant:small-caps;border-bottom:none;text-decoration:none;cursor:inherit}.mw-parser-output .navbar-ct-full{font-size:114%;margin:0 7em}.mw-parser-output .navbar-ct-mini{font-size:114%;margin:0 4em}html.skin-theme-clientpref-night .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}@media(prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}}@media print{.mw-parser-output .navbar{display:none!important}}
/* end https://en.wikipedia.org/ */
</style><div id="Software_design_patterns225" style="font-size:114%;margin:0 4em"><a href="Software_design_pattern" title="Software design pattern">Software design patterns</a></div></th></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Design_Patterns" title="Design Patterns">Gang of Four<br>patterns</a></th><td class="navbox-list-with-group navbox-list navbox-odd hlist" style="width:100%;padding:0"><div style="padding:0 0.25em"></div><table class="nowraplinks navbox-subgroup" style="border-spacing:0"><tbody><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Creational_pattern" title="Creational pattern">Creational</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Abstract_factory_pattern" title="Abstract factory pattern">Abstract factory</a></li>
<li><a href="Builder_pattern" title="Builder pattern">Builder</a></li>
<li><a href="Factory_method_pattern" title="Factory method pattern">Factory method</a></li>
<li><a href="Prototype_pattern" title="Prototype pattern">Prototype</a></li>
<li><a href="Singleton_pattern" title="Singleton pattern">Singleton</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Structural_pattern" title="Structural pattern">Structural</a></th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Adapter_pattern" title="Adapter pattern">Adapter</a></li>
<li><a href="Bridge_pattern" title="Bridge pattern">Bridge</a></li>
<li><a href="Composite_pattern" title="Composite pattern">Composite</a></li>
<li><a href="Decorator_pattern" title="Decorator pattern">Decorator</a></li>
<li><a href="Facade_pattern" title="Facade pattern">Facade</a></li>
<li><a href="Flyweight_pattern" title="Flyweight pattern">Flyweight</a></li>
<li><a href="Proxy_pattern" title="Proxy pattern">Proxy</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Behavioral_pattern" title="Behavioral pattern">Behavioral</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Chain-of-responsibility_pattern" title="Chain-of-responsibility pattern">Chain of responsibility</a></li>
<li><a href="Command_pattern" title="Command pattern">Command</a></li>
<li><a href="Interpreter_pattern" title="Interpreter pattern">Interpreter</a></li>
<li><a href="Iterator_pattern" title="Iterator pattern">Iterator</a></li>
<li><a href="Mediator_pattern" title="Mediator pattern">Mediator</a></li>
<li><a href="Memento_pattern" title="Memento pattern">Memento</a></li>
<li><a href="Observer_pattern" title="Observer pattern">Observer</a></li>
<li><a href="State_pattern" title="State pattern">State</a></li>
<li><a href="Strategy_pattern" title="Strategy pattern">Strategy</a></li>
<li><a href="Template_method_pattern" title="Template method pattern">Template method</a></li>
<li><a href="Visitor_pattern" title="Visitor pattern">Visitor</a></li></ul>
</div></td></tr></tbody></table><div></div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Concurrency_pattern" title="Concurrency pattern">Concurrency<br>patterns</a></th><td class="navbox-list-with-group navbox-list navbox-even hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Active_object" title="Active object">Active object</a></li>
<li><a href="Balking_pattern" title="Balking pattern">Balking</a></li>
<li><a href="Binding_properties_pattern" title="Binding properties pattern">Binding properties</a></li>
<li><a href="Double-checked_locking" title="Double-checked locking">Double-checked locking</a></li>
<li><a href="Asynchronous_method_invocation" title="Asynchronous method invocation">Event-based asynchronous</a></li>
<li><a href="Guarded_suspension" title="Guarded suspension">Guarded suspension</a></li>
<li><a href="Join-pattern" title="Join-pattern">Join</a></li>
<li><a href="Lock_(computer_science)" title="Lock (computer science)">Lock</a></li>
<li><a href="Monitor_(synchronization)" title="Monitor (synchronization)">Monitor</a></li>
<li><a href="Proactor_pattern" title="Proactor pattern">Proactor</a></li>
<li><a href="Reactor_pattern" title="Reactor pattern">Reactor</a></li>
<li><a href="Readers%E2%80%93writer_lock" title="Readers–writer lock">Read–write lock</a></li>
<li><a href="Scheduler_pattern" class="mw-redirect" title="Scheduler pattern">Scheduler</a></li>
<li><a href="Scheduled-task_pattern" title="Scheduled-task pattern">Scheduled-task pattern</a></li>
<li><a href="Semaphore_(programming)" title="Semaphore (programming)">Semaphore</a></li>
<li><a href="Thread_pool" title="Thread pool">Thread pool</a></li>
<li><a href="Thread-local_storage" title="Thread-local storage">Thread-local storage</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Architectural_pattern" title="Architectural pattern">Architectural<br>patterns</a></th><td class="navbox-list-with-group navbox-list navbox-odd hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Front_controller" title="Front controller">Front controller</a></li>
<li><a href="Interceptor_pattern" title="Interceptor pattern">Interceptor</a></li>
<li><a href="Model%E2%80%93view%E2%80%93controller" title="Model–view–controller">MVC</a>
<ul><li><a href="Model%E2%80%93view%E2%80%93presenter" title="Model–view–presenter">MVP</a></li>
<li><a href="Model%E2%80%93view%E2%80%93viewmodel" title="Model–view–viewmodel">MVVM</a></li></ul></li>
<li><a href="Action%E2%80%93domain%E2%80%93responder" title="Action–domain–responder">ADR</a></li>
<li><a href="Entity_component_system" title="Entity component system">ECS</a></li>
<li><a href="Multitier_architecture" title="Multitier architecture"><i>n</i>-tier</a></li>
<li><a href="Specification_pattern" title="Specification pattern">Specification</a></li>
<li><a href="Publish%E2%80%93subscribe_pattern" title="Publish–subscribe pattern">Publish–subscribe</a></li>
<li><a href="Naked_objects" title="Naked objects">Naked objects</a></li>
<li><a href="Service_locator_pattern" title="Service locator pattern">Service locator</a></li>
<li><a href="Active_record_pattern" title="Active record pattern">Active record</a></li>
<li><a href="Identity_map_pattern" title="Identity map pattern">Identity map</a></li>
<li><a href="Data_access_object" title="Data access object">Data access object</a></li>
<li><a href="Data_transfer_object" title="Data transfer object">Data transfer object</a></li>
<li><a href="JSP_model_2_architecture" title="JSP model 2 architecture">Model 2</a></li>
<li><a href="Broker_pattern" title="Broker pattern">Broker</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Other<br>patterns</th><td class="navbox-list-with-group navbox-list navbox-even hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Blackboard_design_pattern" class="mw-redirect" title="Blackboard design pattern">Blackboard</a></li>
<li><a href="Business_delegate_pattern" title="Business delegate pattern">Business delegate</a></li>
<li><a href="Composite_entity_pattern" title="Composite entity pattern">Composite entity</a></li>
<li><a href="Dependency_injection" title="Dependency injection">Dependency injection</a></li>
<li><a href="Guard_(computer_science)" title="Guard (computer science)">Guard clause</a></li>
<li><a href="Intercepting_filter_pattern" title="Intercepting filter pattern">Intercepting filter</a></li>
<li><a href="Lazy_loading" title="Lazy loading">Lazy loading</a></li>
<li><a href="Mock_object" title="Mock object">Mock object</a></li>
<li><a href="Null_object_pattern" title="Null object pattern">Null object</a></li>
<li><a href="Object_pool_pattern" title="Object pool pattern">Object pool</a></li>
<li><a href="Servant_(design_pattern)" title="Servant (design pattern)">Servant</a></li>
<li><a href="Twin_pattern" title="Twin pattern">Twin</a></li>
<li><a href="Type_Tunnel_pattern" class="mw-redirect" title="Type Tunnel pattern">Type tunnel</a></li>
<li><a href="Method_chaining" title="Method chaining">Method chaining</a></li>
<li><a href="Delegation_pattern" title="Delegation pattern">Delegation</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Books</th><td class="navbox-list-with-group navbox-list navbox-odd hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><i><a href="Design_Patterns" title="Design Patterns">Design Patterns</a></i></li>
<li><i><a href="Enterprise_Integration_Patterns" title="Enterprise Integration Patterns">Enterprise Integration Patterns</a></i></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">People</th><td class="navbox-list-with-group navbox-list navbox-even hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Christopher_Alexander" title="Christopher Alexander">Christopher Alexander</a></li>
<li><a href="Erich_Gamma" title="Erich Gamma">Erich Gamma</a></li>
<li><a href="Ralph_Johnson_(computer_scientist)" title="Ralph Johnson (computer scientist)">Ralph Johnson</a></li>
<li><a href="John_Vlissides" title="John Vlissides">John Vlissides</a></li>
<li><a href="Grady_Booch" title="Grady Booch">Grady Booch</a></li>
<li><a href="Kent_Beck" title="Kent Beck">Kent Beck</a></li>
<li><a href="Ward_Cunningham" title="Ward Cunningham">Ward Cunningham</a></li>
<li><a href="Martin_Fowler_(software_engineer)" title="Martin Fowler (software engineer)">Martin Fowler</a></li>
<li><a href="Robert_C._Martin" title="Robert C. Martin">Robert Martin</a></li>
<li><a href="Jim_Coplien" title="Jim Coplien">Jim Coplien</a></li>
<li><a href="Douglas_C._Schmidt" title="Douglas C. Schmidt">Douglas Schmidt</a></li>
<li><a href="Linda_Rising" title="Linda Rising">Linda Rising</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Communities</th><td class="navbox-list-with-group navbox-list navbox-odd hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="The_Hillside_Group" title="The Hillside Group">The Hillside Group</a></li>
<li><a href="Portland_Pattern_Repository" title="Portland Pattern Repository">Portland Pattern Repository</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">See also</th><td class="navbox-list-with-group navbox-list navbox-even hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Anti-pattern" title="Anti-pattern">Anti-pattern</a></li>
<li><a href="Architectural_pattern" title="Architectural pattern">Architectural pattern</a></li></ul>
</div></td></tr></tbody></table></div></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-07-27" href="https://en.wikipedia.org/wiki/?title=Inversion_of_control&oldid=1302881416">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
</body></html>